package com.hmsm.server.base;

import java.io.Serializable;
import java.util.LinkedHashMap;
import java.util.List;

import com.hmsm.server.util.QueryResult;

public interface IBaseDao<T, ID extends Serializable> {

	public T getNew();

	/**
	 * 
	 *  @描述:保存对象信息
	 *  @方法名称:save
	 *  @作者:yaosq
	 *  @创建日期:2014-4-1 下午04:07:19 
	 *  @param object
	 *  @return
	 *
	 */
	public T save(T object);

	/**
	 * 
	 *  @描述:根据对象的有效值，查询满足对象有效值的所有符合数据
	 *  @方法名称:query
	 *  @作者:yaosq
	 *  @创建日期:2014-4-1 下午04:07:31 
	 *  @param object
	 *  @return
	 *
	 */
	public List<T> query(T object);
	
	/**
	 * 根据对象的有效值，查询满足对象有效值的所有符合数据
	 * @param object
	 * @param order		排序字段列表
	 * @return
	 */
	public List<T> query(T object, String order);
	
	/**
	 * 根据对象的有效值，查询满足对象有效值的所有符合数据
	 * @param object
	 * @param order		排序字段列表
	 * @return
	 */
	public List<T> query(T object, String order, Integer pageNo, Integer pageSize);
	
	/**
	 * 根据对象的有效值，查询满足对象有效值的所有符合数据
	 * @param object
	 * @param order		排序字段列表
	 * @return
	 */
	public long queryCount(T object);
	
	/**
	 * 
	 *  @描述:查询当前对象的所有数据
	 *  @方法名称:queryAll
	 *  @作者:yaosq
	 *  @创建日期:2014-4-1 下午04:07:43 
	 *  @return
	 *
	 */
	public List<T> queryAll();

	/**
	 * 
	 *  @描述:更新对象信息
	 *  @方法名称:update
	 *  @作者:yaosq
	 *  @创建日期:2014-4-1 下午04:07:53 
	 *  @param object
	 *  @return
	 *
	 */
	public T update(T object);

	/**
	 * 
	 *  @描述:删除对象数据
	 *  @方法名称:delete
	 *  @作者:yaosq
	 *  @创建日期:2014-4-1 下午04:08:09 
	 *  @param object
	 *  @return
	 *
	 */
	public boolean delete(T object);

	/**
	 * 
	 *  @描述:根据ID值删除对象
	 *  @方法名称:delete
	 *  @作者:yaosq
	 *  @创建日期:2014-4-1 下午04:08:20 
	 *  @param id
	 *
	 */
	public void delete(ID id);

	/**
	 * 
	 *  @描述:删除集合对象信息
	 *  @方法名称:deleteAll
	 *  @作者:yaosq
	 *  @创建日期:2014-4-1 下午04:08:30 
	 *  @param objectArr
	 *  @return
	 *
	 */
	public boolean deleteAll(List<T> objectArr);

	/**
	 * 
	 *  @描述:批量删除对象数据
	 *  @方法名称:delete
	 *  @作者:yaosq
	 *  @创建日期:2014-4-1 下午04:08:09 
	 *  @param object
	 *  @return
	 *
	 */
	public int delByExample(T example);

	/**
	 * 
	 *  @描述:根据对象的主键ID查询对象值，如果没有查询到
	 *  @方法名称:getById
	 *  @作者:yaosq
	 *  @创建日期:2014-4-1 下午04:08:43 
	 *  @param id
	 *  @return
	 *
	 */
	public T getById(ID id);
	
	/**
	 * 
	 *  @描述:根据对象ID获取对象
	 *  @方法名称:load
	 *  @作者:yaosq
	 *  @创建日期:2014-4-1 下午04:09:00 
	 *  @param id
	 *  @return
	 *
	 */
	public T load(ID id);

	/**
	 * 
	 *  @描述:获取对象数据总数
	 *  @方法名称:getCount
	 *  @作者:yaosq
	 *  @创建日期:2014-4-1 下午04:09:18 
	 *  @return
	 *
	 */
	public int getCount();

	/**
	 * hql翻页查询结果
	 *  @描述:
	 *  @方法名称 :queryPageList
	 *  @作者     :shu jun
	 *  @创建日期 :2014年4月10日 下午5:53:55 
	 *  @param hql
	 *  @param nowPage 当前页
	 *  @param maxresult 最大页
	 *  @return
	 *
	 */
	public List<T> queryPageList(String hql, int nowPage, int maxresult);

	/**
	 * 
	 *  @描述:只支持SQL能够分装到Class对应的对象
	 *  @方法名称:queryBySql
	 *  @作者:yaosq
	 *  @创建日期:2014-4-1 下午04:09:42 
	 *  @param sql
	 *  @return
	 *
	 */
	public List<T> queryBySql(String sql);
	
	/**
	 * 查询实体记录结果集
	 * 
	 * @param entityClass
	 *            实体类
	 * @param firstindex
	 *            当前第几页
	 * @param maxresult
	 *            每页显示的记录条数
	 * @param wherejpql
	 *            附加的查询条件（注意实体类已经重命名为别名：o）
	 * @param queryParams
	 *            查询的参数列表
	 * @param orderby
	 *            排序号,key值为对哪个字段进行排序，value值为升序asc还是降序desc
	 * @return QueryResult 查询的结果集，里面含有所有记录的最大记录数以及所有的记录List
	 */
	public QueryResult<T> getScrollData(Class<T> entityClass, String idName, int firstindex, int maxresult, String wherejpql, Object[] queryParams, LinkedHashMap<String, String> orderby);	
	
	public List<List<String>> getSqlByCondition(final String sql);

	public boolean isUnique(T entityVo, String propertyList);	
	
	/**
	 * @描述： 得到分页信息
	 * @创建人： JorisOuYang
	 * @创建时间：2017年2月20日 上午11:59:56
	 * @修改备注：
	 * @version
	 */
	public List<T> getPageMessage(int nowPage,int pageNumber,T object);
	
	/**
	 * @描述： 得到总数
	 * @创建人： JorisOuYang
	 * @创建时间：2017年2月20日 下午1:59:44
	 * @修改备注：
	 * @version
	 */
	public int getCounts(T object);
	
}
